
///////////////////////////////////////////////////////////////////////////////
//
//  Copyright (c) 2009, Perry L Miller IV
//  All rights reserved.
//  BSD License: http://www.opensource.org/licenses/bsd-license.html
//
///////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////
//
//  The cull visitor base class.
//
///////////////////////////////////////////////////////////////////////////////

#include "SceneGraph/Visitors/CullVisitor.h"

#include "Usul/Functions/NoThrow.h"

using namespace SceneGraph::Visitors;


///////////////////////////////////////////////////////////////////////////////
//
//  Constructor.
//
///////////////////////////////////////////////////////////////////////////////

CullVisitor::CullVisitor() : BaseClass(),
  _navigation ( Matrix::getIdentity() ),
  _projection ( Matrix::getIdentity() ),
  _viewport ( Viewport ( 0, 0, 100, 100 ) ),
  _drawLists()
{
}


///////////////////////////////////////////////////////////////////////////////
//
//  Destructor.
//
///////////////////////////////////////////////////////////////////////////////

CullVisitor::~CullVisitor()
{
  USUL_TRY_BLOCK
  {
    _drawLists = DrawLists::RefPtr();
  }
  USUL_DEFINE_CATCH_BLOCKS ( "4108635528" );
}


///////////////////////////////////////////////////////////////////////////////
//
//  Clear this visitor.
//
///////////////////////////////////////////////////////////////////////////////

void CullVisitor::reset()
{
  // Reset members.
  _navigation = Matrix::getIdentity();
  _projection = Matrix::getIdentity();

  // Do not clear "_drawLists" because the architecture supports more than 
  // one cull-visitor working on the same draw-list.

  // Redirect to base class.
  BaseClass::reset();
}


///////////////////////////////////////////////////////////////////////////////
//
//  Set the projection matrix.
//
///////////////////////////////////////////////////////////////////////////////

void CullVisitor::projectionMatrixSet ( const Matrix &m )
{
  _projection = m;
}


///////////////////////////////////////////////////////////////////////////////
//
//  Set the navigation matrix.
//
///////////////////////////////////////////////////////////////////////////////

void CullVisitor::navigationMatrixSet ( const Matrix &m )
{
  _navigation = m;
}


///////////////////////////////////////////////////////////////////////////////
//
//  Set the draw-lists.
//
///////////////////////////////////////////////////////////////////////////////

void CullVisitor::drawListsSet ( DrawLists::RefPtr rl )
{
  _drawLists = rl;
}


///////////////////////////////////////////////////////////////////////////////
//
//  Get the draw-lists.
//
///////////////////////////////////////////////////////////////////////////////

CullVisitor::DrawLists::RefPtr CullVisitor::_drawListsGet()
{
  return _drawLists;
}


///////////////////////////////////////////////////////////////////////////////
//
//  Set the viewport.
//
///////////////////////////////////////////////////////////////////////////////

void CullVisitor::viewportSet ( const Viewport &vp )
{
  _viewport = vp;
}


///////////////////////////////////////////////////////////////////////////////
//
//  Set the viewport.
//
///////////////////////////////////////////////////////////////////////////////

CullVisitor::Viewport CullVisitor::viewportGet() const
{
  return _viewport;
}
